# -*- coding: UTF-8 -*-

import Pyro4
import time
import socket

class Joueur(object):
    def __init__(self,nom):
        self.nom = nom
        self.frame = 1
        self.actionsEnAttente={} ##[Frame a le faire , action]
        self.acceptRequest = True

class Serveur(object):
    def __init__(self):
        ################
        #####FRAME#####
        ################
        self.frameMax=0 #Le numero du plus haut frame
        self.frameAjout=15 #Nombre de frame qu'on peut ajouter pour la future action
        
        
        self.joueurs={}
        self.nbJoueurs=0
        self.seed=time.time()
        self.vaisseauxActif=[]
        self.partieCommence=False  #Est-ce que la partie est commence ?
        print(socket.gethostbyname(socket.gethostname()))
    
    
    
    def loginServ(self, nom):
        ##Regarder si un joueur avec le meme nom est dans la liste
        self.nbJoueurs += 1
        t = Joueur(nom)
        self.joueurs[nom]=t
        
    
    def miseAJour(self, nom, frame):
        ##Inscrit le numero du frame le plus haut dans les joueurs
        rep={}
        self.joueurs[nom].frame = frame
        if frame>self.frameMax:
            self.frameMax=frame
        if self.joueurs[nom].actionsEnAttente:
            if frame<min(self.joueurs[nom].actionsEnAttente.keys()):
                rep = self.joueurs[nom].actionsEnAttente
                self.joueurs[nom].actionsEnAttente={}
        else:
            rep = {}
        return rep
    
    ## actions = [String action, Parametre, Parametre, ...]
    def faireAction(self, nomJoueur, frameClient, action):
        self.joueurs[nomJoueur].frame = frameClient
        frame = frameClient + self.frameAjout
        if frameClient>self.frameMax:
            self.frameMax = frameClient
        if action[0] == "commencerPartie":
            self.partieCommence = True
            return "commencerPartie"
        elif self.partieCommence:
            for i in self.joueurs.keys():    
                if frame in self.joueurs[i].actionsEnAttente.keys():
                    self.joueurs[i].actionsEnAttente[frame].append(action)
                else:
                    self.joueurs[i].actionsEnAttente[frame] = action
            return 1
        elif action[0] == "joueurQuit":
            del self.joueurs[nomJoueur]
            return "fermerJeu"
        else:
            return 0 
        
    def outofsync(self, clientRetard, frameRetard):
        for i in self.joueurs.keys():
            if self.joueurs[i].frame>frameRetard+5:
                self.joueurs[i].acceptRequest=False
            
        
    def checkAllFrames(self, nomJoueur, frameJoueur):
        self.joueurs[nomJoueur].frame = frameJoueur
        plusHaut = 0
        nbOOS=0
        compteur=0
        for i in self.joueurs.keys():
            if self.joueurs[i].frame>plusHaut:
                plusHaut = self.joueurs[i].frame
            
        for i in self.joueurs.keys():
            if self.joueurs[i].frame<plusHaut-5:
                nbOOS+=1
                self.outofsync(compteur,self.joueurs[i].frame)
            compteur+=1
               
        if nbOOS==0:
            for i in self.joueurs.keys():
                self.joueurs[i].acceptRequest=True
                
    def getAcceptRequest(self, nom):
        return self.joueurs[nom].acceptRequest
        
    def isCommence(self): #Averti si la partie est commence
        return self.partieCommence 
    
    def getSeed(self): #Retourne la seed por regenerer le monde
        return self.seed
    
    def getNbJoueurs(self): #Retourne le nombre de joueurs
        return self.nbJoueurs
    
    def getNomsJoueurs(self): #Retourne la liste des noms de Joueurs
        nomsJoueurs=[]
        for i in self.joueurs.keys():
            nomsJoueurs.append(i)
        return nomsJoueurs
    
    def afficher(self, message):
        print(message)
    
    
daemon = Pyro4.core.Daemon(host=socket.gethostname(), port=54440)
daemon.register(Serveur(), "Serveur")
print("Serveur Pyro activé !")
daemon.requestLoop()